home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
boot
/
czesc_2
/
onekeyii
/
src
/
onekey.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-11-23
|
7KB
|
306 lines
/*
* OneKeyII
*
* Inspired by OneKey, a program by Carolyn Scheppner of CATS.
* This incarnation fixes some problems OneKey had with 2.1,
* adds a few useful features and improves compatibility with
* other programs.
*
* Code was rather cobbled together with stuff I had lying at
* hand, so please excuse any lack of clarity.
*
* #include <std_disclaimer.h> // no warranties attached.
* Placed in the public domain by
* Martin W. Scott, Monday 23-Nov-92.
*/
#include <exec/libraries.h>
#include <libraries/commodities.h>
#include <dos/dos.h>
#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
#include <clib/alib_stdio_protos.h>
#include <clib/commodities_protos.h>
#include <devices/inputevent.h>
#include "icon.h" /* my icon routines */
#define INTERRUPT void __interrupt __saveds
BOOL OpenLibs(void);
void CloseLibs(void);
void _main(void);
void ProcessMsg(void);
INTERRUPT OneKeyHandler(CxMsg *, CxObj *);
extern void DrawState(UWORD);
extern void InitWindowPos(void);
extern BOOL ShowWindow(void);
extern void HideWindow(void);
extern BOOL HandleIDCMP(void);
extern struct WBStartup *WBenchMsg;
struct Library *CxBase, *IconBase, *GadToolsBase;
struct GfxBase *GfxBase;
struct IntuitionBase *IntuitionBase;
struct MsgPort *broker_mp;
CxObj *broker, *cocustom, *popobj;
struct NewBroker newbroker =
{
NB_VERSION,
"OneKeyII", /* string to identify this broker */
"OneKeyII",
"Type one-key-at-a-time (public domain)",
NBU_UNIQUE | NBU_NOTIFY,
COF_SHOW_HIDE
};
UBYTE *vers = "\0$VER: OneKeyII 1.0";
struct Task *task;
ULONG cxsigflag, signal, cxobjsignal;
UWORD quals;
BOOL toggle;
#define EVT_POPKEY 1L
BOOL
OpenLibs() /* open required libraries */
{
if ((GfxBase = (void *) OpenLibrary("graphics.library", 0L)) &&
(IntuitionBase = (void *) OpenLibrary("intuition.library", 37L)) &&
(GadToolsBase = (void *) OpenLibrary("gadtools.library", 37L)) &&
(IconBase = (void *) OpenLibrary("icon.library", 37L)) &&
(CxBase = (void *) OpenLibrary("commodities.library", 37L)))
return TRUE;
CloseLibs();
return FALSE;
}
void
CloseLibs() /* close opened libraries */
{
if (IconBase)
CloseLibrary(IconBase);
if (CxBase)
CloseLibrary(CxBase);
if (GfxBase)
CloseLibrary(GfxBase);
if (IntuitionBase)
CloseLibrary(IntuitionBase);
if (GadToolsBase)
CloseLibrary(GadToolsBase);
}
void
_main()
{
UBYTE *popstr;
CxMsg *msg;
if (OpenLibs())
{
if (broker_mp = CreateMsgPort())
{
newbroker.nb_Port = broker_mp;
cxsigflag = 1L << broker_mp->mp_SigBit;
GetOurIcon(WBenchMsg);
newbroker.nb_Pri = (BYTE) TTInt("CX_PRIORITY", 127);
popstr = TTString("CX_POPKEY", "control 1");
if (broker = CxBroker(&newbroker, NULL))
{
if (cocustom = CxCustom(OneKeyHandler, 0L))
{
AttachCxObj(broker, cocustom);
/* Allocate a signal bit for the signal CxObj */
if ((signal = (ULONG) AllocSignal(-1L)) != -1)
{
/* set up the signal mask */
cxobjsignal = 1L << signal;
cxsigflag |= cxobjsignal;
task = FindTask(NULL);
/* NB: hotkey added AFTER handler, so it works with one-key */
if (popobj = HotKey(popstr, broker_mp, EVT_POPKEY))
{
AttachCxObj(broker, popobj);
toggle = TTBool("TOGGLE", FALSE);
InitWindowPos();
if (TTBool("CX_POPUP", TRUE))
ShowWindow();
FreeOurIcon();
ActivateCxObj(broker, 1L);
ProcessMsg();
HideWindow();
FreeSignal(signal);
}
}
}
DeleteCxObjAll(broker);
/* Empty the port of all CxMsgs */
while (msg = (CxMsg *) GetMsg(broker_mp))
ReplyMsg((struct Message *) msg);
}
DeleteMsgPort(broker_mp);
}
CloseLibs();
}
}
void
ProcessMsg(void)
{
extern struct MsgPort *broker_mp;
extern CxObj *broker;
extern ULONG cxsigflag, winsigflag;
extern struct Window *window;
CxMsg *msg;
ULONG sigrcvd, msgid, msgtype;
LONG returnvalue = 1L;
while (returnvalue)
{
sigrcvd = Wait(SIGBREAKF_CTRL_C | cxsigflag | winsigflag);
while (msg = (CxMsg *) GetMsg(broker_mp))
{
msgid = CxMsgID(msg);
msgtype = CxMsgType(msg);
ReplyMsg((struct Message *) msg);
switch (msgtype)
{
case CXM_IEVENT:
if (msgid == EVT_POPKEY)
if (window)
WindowToFront(window);
else
ShowWindow();
break;
case CXM_COMMAND:
switch (msgid)
{
case CXCMD_UNIQUE:
case CXCMD_APPEAR:
ShowWindow();
break;
case CXCMD_DISAPPEAR:
HideWindow();
break;
case CXCMD_DISABLE:
ActivateCxObj(broker, 0L);
break;
case CXCMD_ENABLE:
ActivateCxObj(broker, 1L);
break;
case CXCMD_KILL:
returnvalue = 0L;
break;
}
}
}
if (sigrcvd & SIGBREAKF_CTRL_C)
returnvalue = 0L;
if (sigrcvd & winsigflag)
if (!HandleIDCMP())
returnvalue = 0L;
/* Check to see if the signal CxObj signalled us. */
if ((sigrcvd & cxobjsignal) && window)
DrawState(quals);
}
}
/******************************************************************************/
/* */
/* ONEKEY HANDLER */
/* */
/******************************************************************************/
#define KCNT 7
#define CODE_LSHIFT 0x60
#define CODE_RSHIFT 0x61
#define CODE_CONTROL 0x63
#define CODE_LALT 0x64
#define CODE_RALT 0x65
#define CODE_LAMIGA 0x66
#define CODE_RAMIGA 0x67
UWORD kcodes[] =
{
CODE_LSHIFT, CODE_RSHIFT,
CODE_LALT, CODE_RALT,
CODE_LAMIGA, CODE_RAMIGA,
CODE_CONTROL
};
UWORD kquals[] =
{
IEQUALIFIER_LSHIFT, IEQUALIFIER_RSHIFT,
IEQUALIFIER_LALT, IEQUALIFIER_RALT,
IEQUALIFIER_LCOMMAND, IEQUALIFIER_RCOMMAND,
IEQUALIFIER_CONTROL
};
#define ALL_BUTTONS (IEQUALIFIER_LEFTBUTTON|IEQUALIFIER_RBUTTON|IEQUALIFIER_MIDBUTTON)
#define KEY_QUAL (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT \
|IEQUALIFIER_CONTROL \
|IEQUALIFIER_LALT|IEQUALIFIER_RALT \
|IEQUALIFIER_LCOMMAND|IEQUALIFIER_RCOMMAND)
INTERRUPT
OneKeyHandler(register CxMsg * cxm, CxObj * co)
{
extern struct Window *window; /* display window */
struct InputEvent *ie;
UWORD oldquals, i;
BOOL wasqual; /* is this a qualifier? */
ie = (struct InputEvent *) CxMsgData(cxm);
oldquals = quals; /* spot the difference below... */
if (ie->ie_Class == IECLASS_RAWKEY)
{
if (!(ie->ie_Code & IECODE_UP_PREFIX)) /* a downstroke */
{
/* is code a qualifier key? */
for (i = 0, wasqual = FALSE; i < KCNT; i++)
if (ie->ie_Code == kcodes[i])
{
if (toggle)
quals ^= kquals[i];
else
quals |= kquals[i];
wasqual = TRUE;
}
if (!wasqual && quals) /* non-qualifier - add quals */
{
ie->ie_Qualifier |= quals; /* coallesce qualifiers */
quals = 0; /* reset them */
}
}
}
else if (ie->ie_Class == IECLASS_RAWMOUSE) /* mouse-cancel? */
{
if (ie->ie_Code != IECODE_NOBUTTON && (ie->ie_Qualifier & KEY_QUAL))
quals = 0;
}
if (oldquals != quals && window) /* update display */
Signal(task, cxobjsignal);
}